package com.friends.utils.geninfo;

import java.time.Clock;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 随机姓名生成器
 * @author qz.z
 */
public class RandomNameMaker {

    public static List<String> getFullNameList(int count) {
        final long start = Clock.systemDefaultZone().millis();

        final List<String> fullNameList = new ArrayList<String>();
        final List<String> surnameList = getSurnameSet(count);
        final List<String> nameList = getNameSet(count);

        // 进行 姓氏与名字 拼接
        for (int i = 0; i < count; i++) {
            fullNameList.add(surnameList.get(i) + nameList.get(i));
        }

        final long end = Clock.systemDefaultZone().millis();
        System.out.println("生成姓名：" + fullNameList.size() + "个\n" + "耗时："
                + (end - start) + "ms");

        return fullNameList;
    }

    /**
     * 姓氏可以重复 ，1~2字（单姓、复姓）
     *
     * @param 条目
     * @return 姓氏集合
     */
    private static List<String> getSurnameSet(int count) {
        Random r = new Random();
        List<String> surnameList = new ArrayList<String>(count);

        // 随机读取数组，生成姓氏
        final String surname[] = { "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "林",
                "傅", "许", "宋", "江", "洪", "游", "包", "钟", "陈", "菜", "曹", "高",
                "杨", "甘", "黄", "兰", "雷", "梁", "张", "章", "刘", "吕", "欧", "裘",
                "苏", "任", "温", "翁", "徐", "谢", "郭", "薛", "段", "楚", "叶", "赖",
                "何", "沈", "卓", "施", "邱", "凌", "涂", "池", "龙", "曾", "熊", "戴",
                "严", "汤", "汪", "侯", "卢", "蓝", "冯", "方", "颜", "石", "朱", "袁",
                "邓", "丁", "庄", "康", "邹", "廖", "向", "郝", "杜", "易", "顾", "朱",
                "花", "焦", "毛", "华", "田", "莫", "尤", "金", "尚", "谭", "隆", "曲",
                "马", "盘", "武", "陆", "典", "艾", "董", "萧", "陶", "简", "安", "贝",
                "白", "成", "崔", "霍", "常", "程", "荆", "邢", "展", "代", "狄", "韩",
                "孔", "费", "申", "樊", "房", "付", "葛", "关", "谷", "龚", "胡", "古",
                "房", "付", "盖", "宫", "后", "海", "贺", "牛", "罗", "蒋", "姜", "姬",
                "井", "鞠", "贾", "景", "纪", "解", "靳", "甲", "柯", "柳", "黎", "娄",
                "冷", "麦", "闫", "宁", "聂", "步", "南", "品", "彭", "平", "于", "浦",
                "庞", "裴", "秦", "齐", "乔", "阮", "沙", "胜", "萨", "夏", "腾", "佟",
                "唐", "巫", "伍", "万", "魏", "文", "史", "韦", "肖", "俞", "余", "玉",
                "宇", "伊", "言", "左", "岳", "詹", "窦", "盘", "墨", "芈", "甄", "赢",
                "廉", "詹", "南宫", "司马", "诸葛", "百里", "上官", "公孙", "东方", "欧阳", "独孤",
                "皇甫", "司徒", "长孙", "慕容", "夏侯", "拓拔", "司空", "西门", "东郭", "端木",
                "纳兰", "完颜", "宇文", "轩辕", "尉迟", "耶律", "令狐", "东皇", "呼延", "太史",
                "司寇", "澹台", "单于", };

        final int len = surname.length;
        final int total = count;// 生成的名字数量
        String newSurname = "";
        int size = surnameList.size();

        while (size < total) {
            newSurname = surname[r.nextInt(len)];
            surnameList.add(newSurname);
            size = surnameList.size();
        }
        return surnameList;
    }

    /**
     * 名字允许重复 1、名字长度：1~2字
     *
     * @do 一个随机数，判断0和1，名字在 1~2 字之间切换
     * @param 条目
     * @return 名字集合
     */
    private static List<String> getNameSet(int count) {
        Random r = new Random();
        List<String> nameList = new ArrayList<String>(count);

        // 随机读取数组，生成名字
        final String name[] = { "月", "节", "杰", "威", "为", "里", "橙", "岑", "参",
                "点", "时", "未", "美", "霖", "琳", "临", "灵", "令", "玲", "久", "九",
                "娘", "歌", "哥", "全", "明", "日", "国", "果", "项", "相", "勤", "青",
                "清", "能", "雄", "天", "答", "梅", "开", "卡", "合", "和", "舍", "男",
                "军", "骏", "君", "隽", "恩", "额", "油", "佑", "码", "帕", "新", "抢",
                "达", "竣", "名", "茗", "鸣", "命", "民", "敏", "珉", "蜜", "米", "秘",
                "觅", "组", "祖", "卒", "式", "师", "实", "示", "适", "意", "宜", "魂",
                "环", "欢", "幻", "田", "待", "松", "嵩", "微", "维", "伟", "薇", "玮",
                "问", "斌", "宾", "滨", "兵", "彬", "冰", "屏", "丙", "栟", "页", "野",
                "夜", "邪", "冶", "烨", "置", "知", "字", "志", "智", "直", "支", "至",
                "质", "芝", "治", "枝", "芷", "织", "挚", "若", "偌", "洛", "萝", "落",
                "婷", "庭", "廷", "德", "匹", "平", "庆", "丕", "好", "冒", "猫", "茂",
                "矛", "卯", "圈", "权", "泉", "铨", "域", "鱼", "考", "爱", "暧", "晴",
                "箐", "情", "倾", "琴", "沁", "层", "熟", "叟", "奎", "葵", "愧", "桂",
                "云", "韵", "运", "允", "芸", "匀", "蕴", "管", "官", "冠", "光", "量",
                "亮", "连", "凉", "靓", "联", "莲", "恋", "帘", "信", "鑫", "欣", "芯",
                "心", "馨", "歆", "锌", "形", "醒", "星", "兴", "幸", "杏", "骍", "香",
                "乡", "享", "祥", "想", "翔", "巷", "湘", "芗", "养", "样", "羊", "空",
                "木", "阳", "洋", "央", "杨", "拓", "司", "门", "东", "端", "纳", "雀",
                "烟", "颜", "燕", "轩", "迟", "律", "令", "皇", "艳", "炎", "岩", "妍",
                "雁", "台", "单", "宴", "焉", "焱", "嫣", "砚", "先", "现", "仙", "显",
                "贤", "闲", "鲜", "弦", "献", "纤", "宪", "冼", "羡", "娴", "炀", "仰",
                "漾", "藕", "耦", "末", "土", "兔", "荼", "棉", "绵", "免", "冕", "缅",
                "店", "娜", "那", "陌", "默", "水", "岁", "随", "虽", "遂", "岛", "道",
                "稻", "奥", "傲", "宝", "别", "币", "毕", "碧", "壁", "笔", "璧", "壳",
                "客", "思", "丝", "斯", "寺", "巳", "丹", "旦", "郸", "当", "党", "员",
                "源", "园", "圆", "缘", "苑", "鸢", "沅", "因", "音", "印", "银", "吟",
                "寅", "茵", "荫", "垠", "胤", "依", "义", "翼", "乙", "仪", "怡", "亿",
                "艺", "衣", "益", "异", "毅", "议", "轶", "祎", "凡", "帆", "蕃", "氾",
                "法", "乏", "筏", "垡", "佱", "芳", "坊", "悔", "灰", "慧", "汇", "辉",
                "惠", "卉", "晖", "茴", "荟", "讳", "珲", "动", "冬", "冻", "栋", "勾",
                "媾", "匹", "又", "优", "邮", "友", "幽", "悠", "攸", "忧", "见", "劲",
                "间", "建", "健", "剑", "坚", "鉴", "茧", "福", "副", "夫", "富", "复",
                "弗", "女", "算", "将", "浆", "疆", "匠", "工", "公", "今", "尽", "禁",
                "锦", "津", "晋", "晶", "静", "瑾", "京", "镜", "净", "菁", "婧", "睛",
                "叉", "察", "岔", "总", "纵", "踪", "宗", "注", "忒", "泰", "体", "题",
                "缇", "屉", "视", "透", "忑", "骨", "儿", "尔", "耳", "洱", "珥", "梦",
                "萌", "词", "慈", "修", "休", "秀", "绣", "宿", "朽", "琇", "雕", "迪",
                "其", "气", "器", "起", "期", "奇", "骑", "启", "琦", "琪", "棋", "柒",
                "祺", "祁", "弃", "崎", "奕", "戚", "汽", "契", "泣", "旗", "岂", "离",
                "俐", "丽", "礼", "莉", "力", "梨", "励", "厉", "荔", "吏", "璃", "笠",
                "砾", "骊", "狸", "隶", "沥", "篱", "厘", "计", "机", "几", "记", "基",
                "极", "积", "济", "忌", "际", "迹", "冀", "骥", "霁", "蓟", "玑", "素",
                "酥", "涑", "数", "树", "叔", "熟", "书", "疏", "舒", "术", "姝", "淑",
                "竖", "殊", "枢", "漱", "黍", "纾", "倏", "笑", "小", "校", "霄", "潇",
                "骁", "宵", "孝", "逍", "啸", "占", "战", "盏", "崭", "赞", "簪", "昝",
                "定", "鼎", "叮", "仔", "紫", "兹", "姿", "态", "真", "孜", "姊", "缁",
                "第", "碌", "帝", "笛", "蒂", "谛", "玢", "户", "虎", "珑", "陇", "缎",
                "路", "录", "露", "鹿", "芦", "泸", "舞", "学", "血", "雪", "仁", "壬",
                "荏", "元", "苑", "蕴", "喜", "细", "熙", "夕", "昔", "兮", "曦", "行",
                "茜", "谦", "朋", "湓", "蓬", "莱", "籁", "菊", "桔", "精", "册", "策",
                "澈", "泽", "哲", "喆", "柘", "塔", "沓", };

        final int len = name.length;
        final int total = count;// 生成的名字数量
        String newName = "";
        int size = nameList.size();

        while (size < total) {

            newName = r.nextInt(2) > 0 ? name[r.nextInt(len)] : name[r
                    .nextInt(len)] + name[r.nextInt(len)];

            nameList.add(newName);
            size = nameList.size();
        }
        return nameList;
    }
}